{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPU0 Memory: 11172MB\n"
     ]
    }
   ],
   "source": [
    "from pynvml import *\n",
    "\n",
    "nvmlInit()\n",
    "vram = nvmlDeviceGetMemoryInfo(nvmlDeviceGetHandleByIndex(0)).free/1024.**2\n",
    "print('GPU0 Memory: %dMB' % vram)\n",
    "if vram < 8000:\n",
    "    raise Exception('GPU Memory too low')\n",
    "nvmlShutdown()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import cv2\n",
    "import h5py\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import *\n",
    "from collections import Counter\n",
    "import seaborn as sns\n",
    "from tqdm import tqdm\n",
    "import pandas as pd\n",
    "import re\n",
    "import time\n",
    "import random\n",
    "\n",
    "from keras.layers import *\n",
    "from keras.models import *\n",
    "from keras.optimizers import *\n",
    "from keras.regularizers import l2\n",
    "from keras.utils.vis_utils import model_to_dot\n",
    "import keras.backend as K\n",
    "from make_parallel import make_parallel\n",
    "\n",
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'retina'\n",
    "IMAGE_DIR = 'image_contest_level_2'\n",
    "\n",
    "DESCRIPTION = 'l2加层生成器2'\n",
    "MODEL_NAME = 'model_%s_best.h5' % DESCRIPTION"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 载入基本数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df = pd.read_csv('image_contest_level_2/labels.txt', sep=' ', header=None)\n",
    "characters = u'0123456789()+-*/=君不见黄河之水天上来奔流到海复回烟锁池塘柳深圳铁板烧; '\n",
    "\n",
    "labels_len = np.array(map(lambda x:len(x.decode('utf-8')), df[0]))\n",
    "n_len = 45\n",
    "n, width, height, n_class, channels = 100000, 900, 72, len(characters), 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def decode(out):\n",
    "    return ''.join([characters[x] for x in out if x < n_class-1 and x > -1])\n",
    "\n",
    "def disp2(img):\n",
    "    cv2.imwrite('a.png', img)\n",
    "    return display(Image('a.png'))\n",
    "\n",
    "def disp(img, txt=None, first=False):\n",
    "    global index\n",
    "    if first:\n",
    "        index = 1\n",
    "        plt.figure(figsize=(16, 9))\n",
    "    else:\n",
    "        index += 1\n",
    "    plt.subplot(4, 1, index)\n",
    "    if len(img.shape) == 2:\n",
    "        plt.imshow(img, cmap='gray')\n",
    "    else:\n",
    "        plt.imshow(img[:,:,::-1])\n",
    "    if txt:\n",
    "        plt.title(txt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 构建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[None, 112, 9, 128] 112 1152\n"
     ]
    }
   ],
   "source": [
    "def ctc_lambda_func(args):\n",
    "    y_pred, labels, input_length, label_length = args\n",
    "    y_pred = y_pred[:, 2:, :]\n",
    "    return K.ctc_batch_cost(labels, y_pred, input_length, label_length)\n",
    "\n",
    "rnn_size = 128\n",
    "\n",
    "l2_rate = 1e-5\n",
    "\n",
    "input_tensor = Input((width, height, 3))\n",
    "x = input_tensor\n",
    "for i, n_cnn in enumerate([2, 3, 6]):\n",
    "    for j in range(n_cnn):\n",
    "        x = Conv2D(32*2**i, (3, 3), padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(l2_rate))(x)\n",
    "        x = BatchNormalization()(x)\n",
    "        x = Activation('relu')(x)\n",
    "    x = MaxPooling2D((2, 2))(x)\n",
    "\n",
    "cnn_model = Model(input_tensor, x, name='cnn')\n",
    "\n",
    "input_tensor = Input((width, height, 3))\n",
    "x = cnn_model(input_tensor)\n",
    "\n",
    "conv_shape = x.get_shape().as_list()\n",
    "rnn_length = conv_shape[1]\n",
    "rnn_dimen = conv_shape[3]*conv_shape[2]\n",
    "\n",
    "print conv_shape, rnn_length, rnn_dimen\n",
    "\n",
    "x = Reshape(target_shape=(rnn_length, rnn_dimen))(x)\n",
    "rnn_length -= 2\n",
    "\n",
    "x = Dense(rnn_size, kernel_initializer='he_normal', kernel_regularizer=l2(l2_rate))(x)\n",
    "x = BatchNormalization()(x)\n",
    "x = Activation('relu')(x)\n",
    "x = Dropout(0.25)(x)\n",
    "\n",
    "gru_1 = GRU(rnn_size, implementation=2, return_sequences=True, name='gru1')(x)\n",
    "gru_1b = GRU(rnn_size, implementation=2, return_sequences=True, go_backwards=True, name='gru1_b')(x)\n",
    "gru1_merged = add([gru_1, gru_1b])\n",
    "\n",
    "gru_2 = GRU(rnn_size, implementation=2, return_sequences=True, name='gru2')(gru1_merged)\n",
    "gru_2b = GRU(rnn_size, implementation=2, return_sequences=True, go_backwards=True, name='gru2_b')(gru1_merged)\n",
    "x = concatenate([gru_2, gru_2b])\n",
    "x = Dropout(0.25)(x)\n",
    "x = Dense(n_class, activation='softmax', kernel_regularizer=l2(l2_rate))(x)\n",
    "rnn_out = x\n",
    "base_model = Model(input_tensor, x)\n",
    "\n",
    "base_model2 = make_parallel(base_model, 4)\n",
    "\n",
    "labels = Input(name='the_labels', shape=[n_len], dtype='float32')\n",
    "input_length = Input(name='input_length', shape=(1,), dtype='int64')\n",
    "label_length = Input(name='label_length', shape=(1,), dtype='int64')\n",
    "loss_out = Lambda(ctc_lambda_func, name='ctc')([base_model2.output, labels, input_length, label_length])\n",
    "\n",
    "model = Model(inputs=(input_tensor, labels, input_length, label_length), outputs=loss_out)\n",
    "model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer='adam')\n",
    "model.save('test.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"1051pt\" viewBox=\"0.00 0.00 524.00 1051.00\" width=\"524pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 1047)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-1047 520,-1047 520,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 140494107021200 -->\n",
       "<g class=\"node\" id=\"node1\"><title>140494107021200</title>\n",
       "<polygon fill=\"none\" points=\"105,-996.5 105,-1042.5 403,-1042.5 403,-996.5 105,-996.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"167.5\" y=\"-1015.8\">input_2: InputLayer</text>\n",
       "<polyline fill=\"none\" points=\"230,-996.5 230,-1042.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"257.5\" y=\"-1027.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"230,-1019.5 285,-1019.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"257.5\" y=\"-1004.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"285,-996.5 285,-1042.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-1027.3\">(None, 900, 72, 3)</text>\n",
       "<polyline fill=\"none\" points=\"285,-1019.5 403,-1019.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-1004.3\">(None, 900, 72, 3)</text>\n",
       "</g>\n",
       "<!-- 140494085157328 -->\n",
       "<g class=\"node\" id=\"node2\"><title>140494085157328</title>\n",
       "<polygon fill=\"none\" points=\"124,-913.5 124,-959.5 384,-959.5 384,-913.5 124,-913.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"164\" y=\"-932.8\">cnn: Model</text>\n",
       "<polyline fill=\"none\" points=\"204,-913.5 204,-959.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"231.5\" y=\"-944.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"204,-936.5 259,-936.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"231.5\" y=\"-921.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"259,-913.5 259,-959.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"321.5\" y=\"-944.3\">(None, 900, 72, 3)</text>\n",
       "<polyline fill=\"none\" points=\"259,-936.5 384,-936.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"321.5\" y=\"-921.3\">(None, 112, 9, 128)</text>\n",
       "</g>\n",
       "<!-- 140494107021200&#45;&gt;140494085157328 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>140494107021200-&gt;140494085157328</title>\n",
       "<path d=\"M254,-996.366C254,-988.152 254,-978.658 254,-969.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-969.607 254,-959.607 250.5,-969.607 257.5,-969.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494107003728 -->\n",
       "<g class=\"node\" id=\"node3\"><title>140494107003728</title>\n",
       "<polygon fill=\"none\" points=\"101.5,-830.5 101.5,-876.5 406.5,-876.5 406.5,-830.5 101.5,-830.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"164\" y=\"-849.8\">reshape_1: Reshape</text>\n",
       "<polyline fill=\"none\" points=\"226.5,-830.5 226.5,-876.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"254\" y=\"-861.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"226.5,-853.5 281.5,-853.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"254\" y=\"-838.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"281.5,-830.5 281.5,-876.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-861.3\">(None, 112, 9, 128)</text>\n",
       "<polyline fill=\"none\" points=\"281.5,-853.5 406.5,-853.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-838.3\">(None, 112, 1152)</text>\n",
       "</g>\n",
       "<!-- 140494085157328&#45;&gt;140494107003728 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>140494085157328-&gt;140494107003728</title>\n",
       "<path d=\"M254,-913.366C254,-905.152 254,-895.658 254,-886.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-886.607 254,-876.607 250.5,-886.607 257.5,-886.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494107004048 -->\n",
       "<g class=\"node\" id=\"node4\"><title>140494107004048</title>\n",
       "<polygon fill=\"none\" points=\"117,-747.5 117,-793.5 391,-793.5 391,-747.5 117,-747.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"168\" y=\"-766.8\">dense_1: Dense</text>\n",
       "<polyline fill=\"none\" points=\"219,-747.5 219,-793.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"246.5\" y=\"-778.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"219,-770.5 274,-770.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"246.5\" y=\"-755.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"274,-747.5 274,-793.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332.5\" y=\"-778.3\">(None, 112, 1152)</text>\n",
       "<polyline fill=\"none\" points=\"274,-770.5 391,-770.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332.5\" y=\"-755.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494107003728&#45;&gt;140494107004048 -->\n",
       "<g class=\"edge\" id=\"edge3\"><title>140494107003728-&gt;140494107004048</title>\n",
       "<path d=\"M254,-830.366C254,-822.152 254,-812.658 254,-803.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-803.607 254,-793.607 250.5,-803.607 257.5,-803.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494106832784 -->\n",
       "<g class=\"node\" id=\"node5\"><title>140494106832784</title>\n",
       "<polygon fill=\"none\" points=\"38.5,-664.5 38.5,-710.5 469.5,-710.5 469.5,-664.5 38.5,-664.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"171.5\" y=\"-683.8\">batch_normalization_12: BatchNormalization</text>\n",
       "<polyline fill=\"none\" points=\"304.5,-664.5 304.5,-710.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332\" y=\"-695.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"304.5,-687.5 359.5,-687.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332\" y=\"-672.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"359.5,-664.5 359.5,-710.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"414.5\" y=\"-695.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"359.5,-687.5 469.5,-687.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"414.5\" y=\"-672.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494107004048&#45;&gt;140494106832784 -->\n",
       "<g class=\"edge\" id=\"edge4\"><title>140494107004048-&gt;140494106832784</title>\n",
       "<path d=\"M254,-747.366C254,-739.152 254,-729.658 254,-720.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-720.607 254,-710.607 250.5,-720.607 257.5,-720.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494103517968 -->\n",
       "<g class=\"node\" id=\"node6\"><title>140494103517968</title>\n",
       "<polygon fill=\"none\" points=\"94,-581.5 94,-627.5 414,-627.5 414,-581.5 94,-581.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"171.5\" y=\"-600.8\">activation_12: Activation</text>\n",
       "<polyline fill=\"none\" points=\"249,-581.5 249,-627.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"276.5\" y=\"-612.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"249,-604.5 304,-604.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"276.5\" y=\"-589.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"304,-581.5 304,-627.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"359\" y=\"-612.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"304,-604.5 414,-604.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"359\" y=\"-589.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494106832784&#45;&gt;140494103517968 -->\n",
       "<g class=\"edge\" id=\"edge5\"><title>140494106832784-&gt;140494103517968</title>\n",
       "<path d=\"M254,-664.366C254,-656.152 254,-646.658 254,-637.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-637.607 254,-627.607 250.5,-637.607 257.5,-637.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494101851344 -->\n",
       "<g class=\"node\" id=\"node7\"><title>140494101851344</title>\n",
       "<polygon fill=\"none\" points=\"109,-498.5 109,-544.5 399,-544.5 399,-498.5 109,-498.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"171.5\" y=\"-517.8\">dropout_1: Dropout</text>\n",
       "<polyline fill=\"none\" points=\"234,-498.5 234,-544.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"261.5\" y=\"-529.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"234,-521.5 289,-521.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"261.5\" y=\"-506.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"289,-498.5 289,-544.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-529.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"289,-521.5 399,-521.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-506.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494103517968&#45;&gt;140494101851344 -->\n",
       "<g class=\"edge\" id=\"edge6\"><title>140494103517968-&gt;140494101851344</title>\n",
       "<path d=\"M254,-581.366C254,-573.152 254,-563.658 254,-554.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-554.607 254,-544.607 250.5,-554.607 257.5,-554.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494101933200 -->\n",
       "<g class=\"node\" id=\"node8\"><title>140494101933200</title>\n",
       "<polygon fill=\"none\" points=\"0,-415.5 0,-461.5 242,-461.5 242,-415.5 0,-415.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"38.5\" y=\"-434.8\">gru1: GRU</text>\n",
       "<polyline fill=\"none\" points=\"77,-415.5 77,-461.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"104.5\" y=\"-446.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"77,-438.5 132,-438.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"104.5\" y=\"-423.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"132,-415.5 132,-461.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"187\" y=\"-446.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"132,-438.5 242,-438.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"187\" y=\"-423.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494101851344&#45;&gt;140494101933200 -->\n",
       "<g class=\"edge\" id=\"edge7\"><title>140494101851344-&gt;140494101933200</title>\n",
       "<path d=\"M217.657,-498.366C201.676,-488.634 182.748,-477.106 165.896,-466.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"167.66,-463.819 157.299,-461.607 164.019,-469.798 167.66,-463.819\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494102541008 -->\n",
       "<g class=\"node\" id=\"node9\"><title>140494102541008</title>\n",
       "<polygon fill=\"none\" points=\"260,-415.5 260,-461.5 516,-461.5 516,-415.5 260,-415.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"305.5\" y=\"-434.8\">gru1_b: GRU</text>\n",
       "<polyline fill=\"none\" points=\"351,-415.5 351,-461.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"378.5\" y=\"-446.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"351,-438.5 406,-438.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"378.5\" y=\"-423.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"406,-415.5 406,-461.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"461\" y=\"-446.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"406,-438.5 516,-438.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"461\" y=\"-423.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494101851344&#45;&gt;140494102541008 -->\n",
       "<g class=\"edge\" id=\"edge8\"><title>140494101851344-&gt;140494102541008</title>\n",
       "<path d=\"M290.616,-498.366C306.717,-488.634 325.788,-477.106 342.767,-466.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"344.681,-469.775 351.428,-461.607 341.06,-463.785 344.681,-469.775\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494101331216 -->\n",
       "<g class=\"node\" id=\"node10\"><title>140494101331216</title>\n",
       "<polygon fill=\"none\" points=\"76,-332.5 76,-378.5 432,-378.5 432,-332.5 76,-332.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"116\" y=\"-351.8\">add_1: Add</text>\n",
       "<polyline fill=\"none\" points=\"156,-332.5 156,-378.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"183.5\" y=\"-363.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"156,-355.5 211,-355.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"183.5\" y=\"-340.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"211,-332.5 211,-378.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"321.5\" y=\"-363.3\">[(None, 112, 128), (None, 112, 128)]</text>\n",
       "<polyline fill=\"none\" points=\"211,-355.5 432,-355.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"321.5\" y=\"-340.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494101933200&#45;&gt;140494101331216 -->\n",
       "<g class=\"edge\" id=\"edge9\"><title>140494101933200-&gt;140494101331216</title>\n",
       "<path d=\"M157.343,-415.366C173.324,-405.634 192.252,-394.106 209.104,-383.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"210.981,-386.798 217.701,-378.607 207.34,-380.819 210.981,-386.798\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494102541008&#45;&gt;140494101331216 -->\n",
       "<g class=\"edge\" id=\"edge10\"><title>140494102541008-&gt;140494101331216</title>\n",
       "<path d=\"M351.384,-415.366C335.283,-405.634 316.212,-394.106 299.233,-383.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"300.94,-380.785 290.572,-378.607 297.319,-386.775 300.94,-380.785\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494099053456 -->\n",
       "<g class=\"node\" id=\"node11\"><title>140494099053456</title>\n",
       "<polygon fill=\"none\" points=\"0,-249.5 0,-295.5 242,-295.5 242,-249.5 0,-249.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"38.5\" y=\"-268.8\">gru2: GRU</text>\n",
       "<polyline fill=\"none\" points=\"77,-249.5 77,-295.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"104.5\" y=\"-280.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"77,-272.5 132,-272.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"104.5\" y=\"-257.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"132,-249.5 132,-295.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"187\" y=\"-280.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"132,-272.5 242,-272.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"187\" y=\"-257.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494101331216&#45;&gt;140494099053456 -->\n",
       "<g class=\"edge\" id=\"edge11\"><title>140494101331216-&gt;140494099053456</title>\n",
       "<path d=\"M217.657,-332.366C201.676,-322.634 182.748,-311.106 165.896,-300.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"167.66,-297.819 157.299,-295.607 164.019,-303.798 167.66,-297.819\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494099053008 -->\n",
       "<g class=\"node\" id=\"node12\"><title>140494099053008</title>\n",
       "<polygon fill=\"none\" points=\"260,-249.5 260,-295.5 516,-295.5 516,-249.5 260,-249.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"305.5\" y=\"-268.8\">gru2_b: GRU</text>\n",
       "<polyline fill=\"none\" points=\"351,-249.5 351,-295.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"378.5\" y=\"-280.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"351,-272.5 406,-272.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"378.5\" y=\"-257.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"406,-249.5 406,-295.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"461\" y=\"-280.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"406,-272.5 516,-272.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"461\" y=\"-257.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 140494101331216&#45;&gt;140494099053008 -->\n",
       "<g class=\"edge\" id=\"edge12\"><title>140494101331216-&gt;140494099053008</title>\n",
       "<path d=\"M290.616,-332.366C306.717,-322.634 325.788,-311.106 342.767,-300.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"344.681,-303.775 351.428,-295.607 341.06,-297.785 344.681,-303.775\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494095746960 -->\n",
       "<g class=\"node\" id=\"node13\"><title>140494095746960</title>\n",
       "<polygon fill=\"none\" points=\"32,-166.5 32,-212.5 476,-212.5 476,-166.5 32,-166.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"116\" y=\"-185.8\">concatenate_1: Concatenate</text>\n",
       "<polyline fill=\"none\" points=\"200,-166.5 200,-212.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"227.5\" y=\"-197.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"200,-189.5 255,-189.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"227.5\" y=\"-174.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"255,-166.5 255,-212.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"365.5\" y=\"-197.3\">[(None, 112, 128), (None, 112, 128)]</text>\n",
       "<polyline fill=\"none\" points=\"255,-189.5 476,-189.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"365.5\" y=\"-174.3\">(None, 112, 256)</text>\n",
       "</g>\n",
       "<!-- 140494099053456&#45;&gt;140494095746960 -->\n",
       "<g class=\"edge\" id=\"edge13\"><title>140494099053456-&gt;140494095746960</title>\n",
       "<path d=\"M157.343,-249.366C173.324,-239.634 192.252,-228.106 209.104,-217.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"210.981,-220.798 217.701,-212.607 207.34,-214.819 210.981,-220.798\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494099053008&#45;&gt;140494095746960 -->\n",
       "<g class=\"edge\" id=\"edge14\"><title>140494099053008-&gt;140494095746960</title>\n",
       "<path d=\"M351.384,-249.366C335.283,-239.634 316.212,-228.106 299.233,-217.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"300.94,-214.785 290.572,-212.607 297.319,-220.775 300.94,-214.785\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494094314512 -->\n",
       "<g class=\"node\" id=\"node14\"><title>140494094314512</title>\n",
       "<polygon fill=\"none\" points=\"109,-83.5 109,-129.5 399,-129.5 399,-83.5 109,-83.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"171.5\" y=\"-102.8\">dropout_2: Dropout</text>\n",
       "<polyline fill=\"none\" points=\"234,-83.5 234,-129.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"261.5\" y=\"-114.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"234,-106.5 289,-106.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"261.5\" y=\"-91.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"289,-83.5 289,-129.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-114.3\">(None, 112, 256)</text>\n",
       "<polyline fill=\"none\" points=\"289,-106.5 399,-106.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-91.3\">(None, 112, 256)</text>\n",
       "</g>\n",
       "<!-- 140494095746960&#45;&gt;140494094314512 -->\n",
       "<g class=\"edge\" id=\"edge15\"><title>140494095746960-&gt;140494094314512</title>\n",
       "<path d=\"M254,-166.366C254,-158.152 254,-148.658 254,-139.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-139.607 254,-129.607 250.5,-139.607 257.5,-139.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140494094998096 -->\n",
       "<g class=\"node\" id=\"node15\"><title>140494094998096</title>\n",
       "<polygon fill=\"none\" points=\"120.5,-0.5 120.5,-46.5 387.5,-46.5 387.5,-0.5 120.5,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"171.5\" y=\"-19.8\">dense_2: Dense</text>\n",
       "<polyline fill=\"none\" points=\"222.5,-0.5 222.5,-46.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"250\" y=\"-31.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"222.5,-23.5 277.5,-23.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"250\" y=\"-8.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"277.5,-0.5 277.5,-46.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332.5\" y=\"-31.3\">(None, 112, 256)</text>\n",
       "<polyline fill=\"none\" points=\"277.5,-23.5 387.5,-23.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332.5\" y=\"-8.3\">(None, 112, 45)</text>\n",
       "</g>\n",
       "<!-- 140494094314512&#45;&gt;140494094998096 -->\n",
       "<g class=\"edge\" id=\"edge16\"><title>140494094314512-&gt;140494094998096</title>\n",
       "<path d=\"M254,-83.3664C254,-75.1516 254,-65.6579 254,-56.7252\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-56.6068 254,-46.6068 250.5,-56.6069 257.5,-56.6068\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "SVG(model_to_dot(base_model, show_shapes=True).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 载入训练集做验证集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 10240/10240 [00:10<00:00, 960.51it/s] \n"
     ]
    }
   ],
   "source": [
    "n1 = 350*256\n",
    "n2 = 390*256\n",
    "\n",
    "X = np.zeros((n2-n1, width, height, channels), dtype=np.uint8)\n",
    "y = np.zeros((n2-n1, n_len), dtype=np.uint8)\n",
    "\n",
    "for i in tqdm(range(n1, n2)):\n",
    "    img = cv2.imread('crop_split/%d.png'%i).transpose(1, 0, 2)\n",
    "    a, b, _ = img.shape\n",
    "    X[i-n1, :a, :b] = img\n",
    "    \n",
    "    label = df[0][i].decode('utf-8')\n",
    "    y[i-n1,:len(label)] = [characters.find(x) for x in label]\n",
    "    y[i-n1,len(label):] = n_class-1\n",
    "\n",
    "X_val = [X, y, np.ones(n2-n1)*rnn_length, labels_len[n1:n2]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 生成器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 89600/89600 [01:54<00:00, 784.04it/s]\n"
     ]
    }
   ],
   "source": [
    "from collections import defaultdict\n",
    "\n",
    "cn_imgs = defaultdict(list)\n",
    "cn_labels = defaultdict(list)\n",
    "ss_imgs = []\n",
    "ss_labels = []\n",
    "\n",
    "for i in tqdm(range(n1)):\n",
    "    ss = df[0][i].decode('utf-8').split(';')\n",
    "    m = len(ss)-1\n",
    "    ss_labels.append(ss[-1])\n",
    "    ss_imgs.append(cv2.imread('crop_split/%d_%d.png'%(i, 0)).transpose(1, 0, 2))\n",
    "    for j in range(m):\n",
    "        cn_labels[ss[j][0]].append(ss[j])\n",
    "        cn_imgs[ss[j][0]].append(cv2.imread('crop_split/%d_%d.png'%(i, m-j)).transpose(1, 0, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from keras.utils import Sequence\n",
    "\n",
    "class SGen(Sequence):\n",
    "    def __init__(self, batch_size):\n",
    "        self.batch_size = batch_size\n",
    "        self.X_gen = np.zeros((batch_size, width, height, 3), dtype=np.uint8)\n",
    "        self.y_gen = np.zeros((batch_size, n_len), dtype=np.uint8)\n",
    "        self.input_length = np.ones(batch_size)*rnn_length\n",
    "        self.label_length = np.ones(batch_size)*38\n",
    "    \n",
    "    def __len__(self):\n",
    "        return 350*256 // self.batch_size\n",
    "    \n",
    "    def __getitem__(self, idx):\n",
    "        random.seed(time.time()*100000+idx)\n",
    "        self.X_gen[:] = 0\n",
    "        for i in range(self.batch_size):\n",
    "            random_index = random.randint(0, n1-1)\n",
    "            cls = []\n",
    "            ss = ss_labels[random_index]\n",
    "            cs = re.findall(ur'[\\u4e00-\\u9fff]', df[0][random_index].decode('utf-8').split(';')[-1])\n",
    "            random.shuffle(cs)\n",
    "            x = 0\n",
    "            for c in cs:\n",
    "                random_index2 = random.randint(0, len(cn_labels[c])-1)\n",
    "                cls.append(cn_labels[c][random_index2])\n",
    "                img = cn_imgs[c][random_index2]\n",
    "                w, h, _ = img.shape\n",
    "                self.X_gen[i, x:x+w, :h] = img\n",
    "                x += w+2\n",
    "            img = ss_imgs[random_index]\n",
    "            w, h, _ = img.shape\n",
    "            self.X_gen[i, x:x+w, :h] = img\n",
    "            cls.append(ss)\n",
    "\n",
    "            random_str = u';'.join(cls)\n",
    "            self.y_gen[i,:len(random_str)] = [characters.find(x) for x in random_str]\n",
    "            self.y_gen[i,len(random_str):] = n_class-1\n",
    "            self.label_length[i] = len(random_str)\n",
    "        \n",
    "        return [self.X_gen, self.y_gen, self.input_length, self.label_length], np.ones(self.batch_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 可视化生成器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "110.0\n",
      "40.0\n",
      "天=1143;烧=93198;(47070-天/93263)*(烧*93206)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nXvTnAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "gen = SGen(1)\n",
    "(X_vis, y_vis, input_length_vis, label_length_vis), _ = gen[0]\n",
    "print input_length_vis[0]\n",
    "print label_length_vis[0]\n",
    "print decode(y_vis[0])\n",
    "disp2(X_vis[0].transpose((1, 0, 2)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def evaluate():\n",
    "    global out\n",
    "    y_pred = base_model2.predict(X, batch_size=256, verbose=1)\n",
    "    out = K.get_value(K.ctc_decode(y_pred[:,2:], input_length=np.ones(y_pred.shape[0])*rnn_length)[0][0])[:, :n_len]\n",
    "    out[out == -1] = n_class-1\n",
    "    score = (out == y[:,:out.shape[-1]]).all(axis=-1).mean()\n",
    "    base_model.save('model_%s_%.6f.h5' % (DESCRIPTION, score))\n",
    "    return score\n",
    "\n",
    "def train(lr=1e-3, epochs=10, batch_size=128, callbacks=None):\n",
    "    opt = Adam(lr)\n",
    "    model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=opt)\n",
    "    model.fit_generator(SGen(batch_size), steps_per_epoch=350*256/batch_size, \n",
    "                        workers=6, use_multiprocessing=True,\n",
    "                        validation_data=(X_val, np.ones(n2-n1)), epochs=epochs, callbacks=callbacks)\n",
    "    print evaluate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 采用每次训练最好的模型\n",
    "\n",
    "http://keras-cn.readthedocs.io/en/latest/other/callbacks/#modelcheckpoint"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from keras.callbacks import *\n",
    "\n",
    "mc = ModelCheckpoint(MODEL_NAME, save_best_only=True)\n",
    "cl = CSVLogger('model_%s.csv' % DESCRIPTION, append=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "train(epochs=20, callbacks=[mc, cl])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.load_weights(MODEL_NAME)\n",
    "evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "train(1e-4, callbacks=[mc, cl])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.load_weights(MODEL_NAME)\n",
    "evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "train(1e-5, callbacks=[mc, cl])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.load_weights(MODEL_NAME)\n",
    "evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train(1e-4, callbacks=[mc, cl])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model.load_weights(MODEL_NAME)\n",
    "evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train(1e-5, callbacks=[mc, cl])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model.load_weights(MODEL_NAME)\n",
    "evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "base_model.save('model.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
